import java.rmi.RemoteException;
import java.util.Iterator;

import javax.swing.JOptionPane;

public class AlgoInterfaceImpl 
	extends java.rmi.server.UnicastRemoteObject 
	implements AlgoInterface {
	
	int nbThread;
    boolean reqRecuBool[]; // tableau qui indique pour chaque thread ( un par indice) si une req a été reçue
    FileReq reqRecu[];  		// tableau qui stocke les requetes destinées  a chacun des Threads
    boolean jetonRecuBool[]; // tableau qui indique pour chaque thread ( un par indice) si une jeton a été reçue
    Jeton jetonRecu[];  		// tableau qui stocke les requetes destinées  a chacun des Threads
    
    
    AlgoInterfaceImpl(int n)   // constructeur
        throws RemoteException {
    	
    			nbThread= n;
    			
    			reqRecuBool = new boolean[n];
    			jetonRecuBool= new boolean[n];
    			
    			reqRecu = new FileReq[n];
    			jetonRecu = new Jeton[n];
    			
    			initStructure();
        }

    
    // methodes de manipulation des valeurs
    
	public synchronized boolean reqRecueBool(Integer numero) throws RemoteException {
		return reqRecuBool[numero];
	}
	
	public synchronized boolean jetonRecueBool(Integer numero) throws RemoteException {
		return jetonRecuBool[numero];
	}
	
	
	
	
	
	//Poster, récupérer et effacer une requete
	public synchronized FileReq reqRecu(Integer numero) throws RemoteException {
		return  reqRecu[numero];
	}
	
	public synchronized void posterReq(Integer numero,Requete req) throws RemoteException {
		reqRecu[numero].getFileRequete().ajouterQueue(req);
	}
	
	public synchronized void effacerReq(Integer numero) throws RemoteException {
		
		reqRecu[numero].getFileRequete().ViderFile();
	}
	
	
	
	
	
	
	//Poster, récupérer et effacer un jeton
	public synchronized void posterJeton(Integer numero,Jeton j) throws RemoteException {
		jetonRecu[numero]= j;
	}
	
	public synchronized void effacerJeton(Integer numero) throws RemoteException {
		jetonRecu[numero]= null;
	}
	public synchronized Jeton jetonRecu(Integer numero) throws RemoteException {
		return jetonRecu[numero];
	}
	
	
	
	
	// Methode d'affectation de booleens
	
	public synchronized void reqPasserATrue(Integer numero) throws RemoteException {
		reqRecuBool[numero]= true;
	}
	
	public synchronized void jetonPasserATrue(Integer numero) throws RemoteException {
		jetonRecuBool[numero]= true;
	}

	public synchronized void reqPasserAFalse(Integer numero) throws RemoteException {
		reqRecuBool[numero]= false;
	}
	
	public synchronized void jetonPasserAFalse(Integer numero) throws RemoteException {
		jetonRecuBool[numero]= false;
	}
	
	
	
	
	
	// méthode d'initialisation des structures
	
	public void initStructure(){
		int i;
		for (i=0; i<= nbThread-1;  i++){
			reqRecuBool[i]=false;
			jetonRecuBool[i]=false;
			reqRecu[i] = new FileReq();
			jetonRecu[i] = null;
		}
		
	}
	
	// méthodes d'affichage
    public void afficheReqRecu(){
		int i;
		System.out.println("-----------------------------------");
		System.out.println("Voici l etat du tableau de requete");
		for (i=0; i<= nbThread-1;  i++){
				System.out.println(reqRecu[i].toString());
		}
		System.out.println("-----------------------------------");
    }
    
    public void afficheJetonRecu(){
		int i;
		System.out.println("-----------------------------------");
		System.out.println("Voici l etat du tableau de jeton");
		for (i=0; i<= nbThread-1;  i++){
			if (jetonRecu[i]==null){
				System.out.println("null");
			}
			else{
				System.out.println(jetonRecu[i].toString());
			}
		}
		System.out.println("-----------------------------------");
    }
    
    public void afficheReqRecuBool(){
		int i;
		System.out.println("-----------------------------------");
		System.out.println("Voici l etat du tableau des Booleens reqRecu");
		for (i=0; i<= nbThread-1;  i++){
				System.out.println(reqRecuBool[i]);
		}
		System.out.println("-----------------------------------");
    }
	
    public void afficheJetonRecuBool(){
		int i;
		System.out.println("-----------------------------------");
		System.out.println("Voici l etat du tableau des Booleens jetonRecu");
		for (i=0; i<= nbThread-1;  i++){
				System.out.println(jetonRecuBool[i]);
		}
		System.out.println("-----------------------------------");
    }
	
	
}
